package com.hmx.miaosha.mapper;

import com.hmx.miaosha.domain.MiaoshaOrder;
import com.hmx.miaosha.domain.OrderInfo;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.SelectKey;

/**
 * @program: miaosha
 * @description:
 * @author: hmx
 * @create: 2021-10-09 11:26
 **/
public interface OrderMapper{

    @Select("select * from miaosha_order where user_id=#{userId} and goods_id=#{goodsId}")
    MiaoshaOrder getMiaoshaOrderByUserIdGoodsId(@Param("userId")long id, @Param("goodsId")long goodsId);

    /**
     * SelectKey在MyBatis中是为了解决Insert数据时不支持主键自动生成的问题，他可以很随意的设置生成主键的方式。
     * 1. statement是要运行的SQL语句， 他的返回值通过resultType来指定
     * 2. before标识查询语句statement运行的时机
     * 3. keyProperty表示查询结果赋值给代码中的那个对象，keyColumn表示将查询结果赋值给数据库表中哪一列
     * 4. keyProperty和keyColumn都不是必需的，有没有都可以
     * 5. before=true, 插入之前进行查询，可以将查询结果赋给keyProperty和keyColumn,赋给keyColumn相当于更改数据库
     * 6. before=false 先插入，再查询，这时只能将结果赋给keyProperty
     * 7. 赋值给keyProperty用来"读"数据库，赋值给keyColumn用来写数据库
     * 8. selectKey的两大作用: 1、生成主键;2、获取刚刚插入数据的主键。
     * 9. 使用selectKey, 并且使用MySQL的last_insert_id()函数时，before必须为false,也就是说必须先插入然后执行last_insert_id()才能获取插入数据的ID
     */
    @Insert("insert into order_info(user_id, goods_id, goods_name, goods_count, goods_price,order_channel,status,create_date) " +
            "values(#{userId},#{goodsId},#{goodsName},#{goodsCount},#{goodsPrice},#{orderChannel},#{status},#{createDate})")
    @SelectKey(keyColumn = "id", keyProperty = "id", resultType = long.class, before = false, statement = "select last_insert_id()")
    long insert(OrderInfo orderInfo);

    @Insert("insert into miaosha_order(user_id, goods_id, order_id) values(#{userId},#{goodsId},#{orderId})")
    int insertMiaoshaOrder(MiaoshaOrder miaoshaOrder);
}
